package p09_aop之ajc代理;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.stereotype.Component;

/**
 * aop是主要是通过动态代理实现的，但不全是
 * 这章介绍第一种aop实现技术ajc，非代理，在编译阶段进行增强
 * 需要添加一个maven插件，在编译时会去修改class文件，这种用的不多，不多bb
 */
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class MyAjc {
    public static void main(String[] args) {
//        ConfigurableApplicationContext context = SpringApplication.run(MyAjc.class);
//        Target target = context.getBean(Target.class);
//
//        target.foo();
//        context.close();

        new Target().foo();
    }

    /**
     * 待增强的目标类
     */
    @Component
    static class Target {
        public void foo() {
            System.out.println("这是目标类方法...");
        }
    }

    /**
     * 切面类，这个切面类尚未被spring管理
     */
    @Aspect
    static class MyAspect {
        @Before("execution(* Target.foo())")
        public void before() {
            System.out.println("前置通知...");
        }
    }
}
